package com.yami.shop.mystery.common.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.common.util.PageParam;
import com.yami.shop.mystery.common.dto.MysteryBoxExpandDto;
import com.yami.shop.mystery.common.dto.MysteryBoxOpenRecordDto;
import com.yami.shop.mystery.common.model.MysteryBox;
import com.yami.shop.mystery.common.model.MysteryBoxExtension;
import com.yami.shop.mystery.common.model.MysteryBoxOpenRecord;

import java.util.List;

/**
 * 盲盒盒子业务接口
 *
 * @author wxf
 * @date 2023/4/6 10:45
 */
public interface MysteryBoxService extends IService<MysteryBox> {

    /**
     *  商户-查询盲盒列表
     *
     * @param page
     * @param param
     * @return
     */
    IPage<MysteryBox> getPage(PageParam<MysteryBox> page, MysteryBox param);

    /**
     * 平台 --获取分页盲盒数据
     * @param page
     * @param param
     * @return
     */
    IPage<MysteryBox> getPlatformMysteryBoxPage(PageParam<MysteryBox> page, MysteryBox param);

    /**
     *  用户-查询盲盒列表
     *
     * @param page
     * @param userId
     * @return
     */
    IPage<MysteryBox> getMyBoxPage(PageParam<MysteryBox> page, String userId, MysteryBox param);

    /**
     *  用户-查询盲盒个数
     *
     * @param userId
     * @param channelCode
     * @return
     */
    Long getMyBoxNum(String userId, String channelCode);

    /**
     *  新增盲盒
     *
     * @param param
     */
    void saveMysteryBox(MysteryBox param);

    /**
     *  更新盲盒
     *
     * @param param
     */
    void updateMysteryBox(MysteryBox param);

    /**
     *  通过主键删除盲盒
     *
     * @param id
     */
    void deleteMysteryBox(Long id);

    /**
     *  通过主键查询盲盒详细信息
     *
     * @param id
     * @return
     */
    MysteryBox detail(Long id);

    /**
     * 通过主键更新盲盒状态
     *
     * @param id
     * @param status
     */
    void mysteryBoxStatus(Long id, Integer status);

    /**
     *  通过盲盒id查询相关扩展数据
     *
     * @param bid
     * @return
     */
    List<MysteryBoxExpandDto> getBoxProdsByPid(Long bid);

    /**
     *  获取所有未删除盲盒
     *
     * @return
     */
    List<MysteryBox> getListData(Long shopId);

    /**
     *  根据状态获取盲盒列表
     *
     * @return
     */
    List<MysteryBox> getListByShopIdAndStatus(Long shopId,Integer status);

    /**
     * 验证
     * @param mysteryBox
     */
    void invalidById(MysteryBox mysteryBox);

    /**
     * 保存盲盒信息
     *
     * @param mysteryBox
     * @param mysteryBoxExtensions
     */
    void saveMysteryBox(MysteryBox mysteryBox, List<MysteryBoxExtension> mysteryBoxExtensions);

    /**
     * 减少盲盒sku库存
     * @param boxId
     * @param prodCount
     */
    Boolean decrMysteryBoxSkuStocks(Long boxId, Integer prodCount);

    /**
     * 查询所有下架的，商品库存未消耗完的盲盒信息
     *
     * @return
     */
    List<MysteryBox> selectDelist();

    /**
     *  用户-查询盲盒明细
     *
     * @param userId
     * @param boxId
     * @return
     */
    MysteryBox myBoxDetail(String userId, Long boxId);

    /**
     *  用户-开盲盒
     *
     * @param userId
     * @param boxId
     * @param openNum
     * @return
     */
    List<MysteryBoxOpenRecord> openMyBox(String userId, Long boxId, Integer openNum);

    /**
     *  用户-查询已开盲盒列表
     *
     * @param page
     * @param userId
     * @return
     */
    IPage<MysteryBoxOpenRecord> getMyOpenBoxPage(PageParam<MysteryBoxOpenRecord> page, String userId, MysteryBoxOpenRecord param);

    /**
     *  生成二维码和连接
     *
     * @param id
     * @param shopId
     */
    void createQrcode(Long id,Long shopId);

    IPage<MysteryBoxOpenRecordDto> getBoxrecords(PageParam<MysteryBoxOpenRecord> page, String userId, Long boxId);
}
